package com.audio;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;

public class AudioConcatenation {

    /**
     * 拼接两个WAV文件
     *
     * @param inputFile1   第一个输入文件（WAV）
     * @param inputFile2   第二个输入文件（WAV）
     * @param outputFile   输出拼接后的WAV文件
     * @throws Exception   如果拼接失败
     */
    public static void concatenateWav(String inputFile1, String inputFile2, String outputFile) throws Exception {
        // 初始化音频抓取器
        FFmpegFrameGrabber grabber1 = new FFmpegFrameGrabber(inputFile1);
        FFmpegFrameGrabber grabber2 = new FFmpegFrameGrabber(inputFile2);
        grabber1.start();
        grabber2.start();

        // 设置音频录制器，输出拼接后的音频
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, grabber1.getAudioChannels());
        recorder.setSampleRate(grabber1.getSampleRate()); // 设置采样率
        recorder.setAudioBitrate(192000); // 设置音频比特率
        recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE); // 使用 WAV 格式的 PCM 编码
        recorder.setFormat("wav"); // 输出格式为 WAV
        recorder.start();

        // 拼接第一个文件的音频数据
        Frame frame;
        while ((frame = grabber1.grabFrame()) != null) {
            if (frame.samples != null) {
                recorder.recordSamples(frame.samples);
            }
        }

        // 拼接第二个文件的音频数据
        while ((frame = grabber2.grabFrame()) != null) {
            if (frame.samples != null) {
                recorder.recordSamples(frame.samples);
            }
        }

        // 停止并释放资源
        recorder.stop();
        recorder.release();
        grabber1.stop();
        grabber2.stop();
        grabber1.release();
        grabber2.release();

        System.out.println("音频拼接完成，输出文件：" + outputFile);
    }

    public static void main(String[] args) {
        try {
            // 输入的WAV文件路径
            String inputFile1 = "D:\\Code idea\\AudioDemo\\src\\main\\resources\\static\\in\\astral-creepy-dark-logo-254198.wav";
            String inputFile2 = "D:\\Code idea\\AudioDemo\\src\\main\\resources\\static\\in\\relaxing-guitar-loop-v5-245859.wav";

            // 输出的拼接后的WAV文件路径
            String outputFile = "D:\\Code idea\\AudioDemo\\src\\main\\resources\\static\\out\\append.wav";

            // 调用拼接方法
            concatenateWav(inputFile1, inputFile2, outputFile);

        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("音频拼接失败: " + e.getMessage());
        }
    }
}
